<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 使用 AES-256 对数据进行加密
 * 需要事先配置好 encryption_key
 * 支持 string、array 与 object 类型的参数（对于 array 和 object 类型将会保留其键）
 *
 * @param mixed $data 需要加密的内容
 * @return mixed
 */
function encrypt($data)
{
    $CI = get_instance();
    static $start;
    if (!$start) {
        $CI->load->library('encryption');
        $CI->encryption->initialize(
            array(
                'cipher' => 'aes-256',
                'mode' => 'ctr',
            )
        );
        $start = TRUE;
    }
    if (is_array($data) || is_object($data)) {
        foreach ($data as $key => $item) {
            $value = encrypt($item);
            (is_array($data) && $data[$key] = $value) || (is_object($data) && $data->$key = $value);
        }
        return $data;
    } else {
        return $CI->encryption->encrypt($data);
    }
}

/**
 * 对使用 encrypt() 方法加密的数据进行解密
 * 需要事先配置好 encryption_key
 * 支持 string、array 与 object 类型的参数
 *
 * @param mixed $data 需要解密的内容
 * @return mixed
 */
function decrypt($data)
{
    $CI = get_instance();
    static $start;
    if (!$start) {
        $CI->load->library('encryption');
        $CI->encryption->initialize(
            array(
                'cipher' => 'aes-256',
                'mode' => 'ctr',
            )
        );
        $start = TRUE;
    }
    if (is_array($data) || is_object($data)) {
        foreach ($data as $key => $item) {
            $value = decrypt($item);
            (is_array($data) && $data[$key] = $value) || (is_object($data) && $data->$key = $value);
        }
        return $data;
    } else {
        return $CI->encryption->decrypt($data);
    }
}